package nb.photoviewer.slideshow;

import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javafx.animation.FadeTransition;
import javafx.stage.Stage;
import javafx.util.Duration;

public class SlideShowManager {
    @FXML
    private ImageView imageView;   //获取对fxml中的imageview

    @FXML
    private HBox imageHBox;
    //幻灯片顶部图片跑马灯图片区域

    @FXML
    private Label firstLabel;   //第一张图片切换上一张提示
    @FXML
    private Label lastLabel;    //最后一张图片切换下一张提示
    @FXML
    private Label messageLabel;   //播放图片的名称和大小

    @FXML
    private ScrollPane imagescrollpane;

    // 一个变量来存储当前选中的图片文件
    private File currentSelectedImage;

    // 一个列表来存储图片文件
    private List<File> imageFiles = new ArrayList<>();

    //目前的列表索引
    private int imageFilesIndex=0;

    //时钟定时器
    private Timer timer;

    //定义FadeTransition对象,切换图片时的隐退显现效果
    private FadeTransition fadeTransition;

    //放大缩小
    private double orgSceneX, orgSceneY;
    private double orgTranslateX, orgTranslateY;


    //构造方法，传入fxml文件中的控件还有初始化控件内容
    public SlideShowManager(ImageView imageView, HBox imageBox,Label messageLabel,Label firstLabel,Label lastLabel,ScrollPane imagescrollpane) {
        this.imageView=imageView;     //我们的管理程序就是fxml中的ImageView
        imageFiles.clear(); // 清空 imageFiles 列表
        System.out.println("SlideShowManagerv   构造方法   中");
        this.imageHBox=imageBox;
        this.messageLabel=messageLabel;
        this.firstLabel=firstLabel;
        this.lastLabel=lastLabel;
        this.imagescrollpane=imagescrollpane;

    }

    //设置列表的值————由controller调用，只有这个方法调用之后才会有列表数据传过来
    public void SetImageFiles(List<File> Files,int currentIndex){
        this.imageFiles=Files;
        this.imageFilesIndex=currentIndex;
        for(int i=0;i<Files.size();i++){
            System.out.println("SlideShowManager    "+Files.get(i).getName());// 测试一下有没有传过来,有了，
        }

        //默认是第一张，此时imageFilesIndex==0
        SetImageView(imageFilesIndex);

        for(int i=0;i<imageFiles.size();i++){    //把图片控件都预览到HBox上（先设置控件，图片可以后台去放置）
            SetHBoxImage(i);
        }


    }
    //把文件列表的图片设置到主ImageView方法,同时设置imageLabel
    private void SetImageView(int index){
        File file = imageFiles.get(index);
        // 加载图片文件
        Image image = new Image(file.toURI().toString());
        // 设置图片到ImageView中
        imageView.setImage(image);
        // 获取文件名
        String fileName = file.getName(),fileSize;
        // 获取文件大小
        long fileSizeInBytes = file.length();
        // 将文件大小转换为 KB 或 MB，根据实际大小选择合适的单位
        if (fileSizeInBytes < 1024) {
            fileSize=fileSizeInBytes + " bytes";
        } else if (fileSizeInBytes < 1024 * 1024) {
            fileSize=String.format("%.2f KB", (double) fileSizeInBytes / 1024);
        } else {
            fileSize=String.format("%.2f MB", (double) fileSizeInBytes / (1024 * 1024));
        }
        // 将文件名和大小设置到 Label 上
        messageLabel.setText("File Name: " + fileName + "\nFile Size: " + fileSize);
        // 初始化位置
        imageView.setPreserveRatio(true);
        // 将图片平移位置重置为0，在切换图片的时候起作用
        imageView.setTranslateX(0);
        imageView.setTranslateY(0);//让图片旋转角度为0
        imageView.setRotate(0);
        // 重置缩放比例,切换图片时，上一张的放大缩小已经不起作用了
        imageView.setScaleX(1);
        imageView.setScaleY(1);

        // 设置事件处理器————拖动
        imageView.setOnMousePressed((MouseEvent event)->{
            orgSceneX = event.getSceneX();
            orgSceneY = event.getSceneY();
            orgTranslateX = imageView.getTranslateX();
            orgTranslateY = imageView.getTranslateY();
        });
        imageView.setOnMouseDragged((MouseEvent event)->{
            double offsetX = event.getSceneX() - orgSceneX;
            double offsetY = event.getSceneY() - orgSceneY;
            double newTranslateX = orgTranslateX + offsetX;
            double newTranslateY = orgTranslateY + offsetY;
            imageView.setTranslateX(newTranslateX);
            imageView.setTranslateY(newTranslateY);
        });



            System.out.println("图片总数"+imageFiles.size()+" "+index);
            System.out.println("滑条"+imagescrollpane.getVvalue());
//         使用Platform.runLater来确保在FXML加载完成后再执行
//        Platform.runLater(() -> {
//            // 计算新的滚动位置
//            double newScrollPosition = (double) index / imageFiles.size();
//            // 将ScrollPane滚动到新的位置
//            imagescrollpane.setVvalue(newScrollPosition);
//        });

    }

    //图片预览跑马灯部分
   private void SetHBoxImage(int index){
       File file = imageFiles.get(index);
       addImageToHBox(file);
    }
    //把图片加到HBox上面，这个是添加到列表末尾

    private void addImageToHBox(File imageFile){
        // 创建一个新的局部ImageView变量
        ImageView localImageView = new ImageView(new Image(imageFile.toURI().toString(), 90, 90, true, true, true));
        localImageView.setFitHeight(50);
        localImageView.setFitWidth(50);
        localImageView.setPreserveRatio(true);
        localImageView.setEffect(new DropShadow(2.5, 1.5, 1.5, Color.GRAY)); // Example effect
        BorderPane borderPane = new BorderPane();
        borderPane.setPrefSize(55, 55);
        borderPane.setCenter(localImageView);
        BorderPane.setAlignment(localImageView, Pos.CENTER);
        imageHBox.getChildren().add(borderPane);
        setBackgroundAndEventHandlers(borderPane);//为字节点添加背景颜色和点击事件
    }


    private void setBackgroundAndEventHandlers(BorderPane borderPane) {
        System.out.println(imageHBox.getChildren().indexOf(borderPane)+"    damn");    //测试一下加载速度
        // 添加鼠标悬停事件处理程序
        borderPane.setOnMouseEntered(event -> {
            borderPane.setBackground(new Background(new BackgroundFill(Color.LIGHTBLUE.deriveColor(1, 1, 1, 0.5), CornerRadii.EMPTY, Insets.EMPTY)));
        });
        // 添加鼠标移出事件处理程序
        borderPane.setOnMouseExited(event -> {
            borderPane.setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, CornerRadii.EMPTY, Insets.EMPTY)));
        });
        // 添加鼠标单击事件处理程序
        borderPane.setOnMouseClicked(event -> {
            if (event.getButton() == MouseButton.PRIMARY) {
                // 如果是双击，则输出borderPane在hbox子列表中的索引
                if (event.getClickCount() == 2) {
                    int index = imageHBox.getChildren().indexOf(borderPane);
                    System.out.println("双击，索引为：" + index);
                    imageFilesIndex=index;
                    firstLabel.setText("");
                    lastLabel.setText("");
                    SetImageView(imageFilesIndex);
                }
            }
        });
    }

    //上一张,注意一下范围
    void PreviousImage(){
        lastLabel.setText("");
        if(imageFilesIndex-1>=0){
            imageFilesIndex--;
            // 创建并设置淡出效果
            FadeTransition fadeOutTransition = new FadeTransition(Duration.millis(1000), imageView);
            fadeOutTransition.setFromValue(1.0); // 完全不透明
            fadeOutTransition.setToValue(0.0);   // 完全透明

            fadeOutTransition.setOnFinished(event -> {
                // 切换到下一张图片
                SetImageView(imageFilesIndex);
                // 创建并设置淡入效果
                FadeTransition fadeInTransition = new FadeTransition(Duration.millis(1000), imageView);
                fadeInTransition.setFromValue(0.0); // 完全透明
                fadeInTransition.setToValue(1.0);   // 完全不透明
                fadeInTransition.play();
            });
            // 开始播放淡出效果
            fadeOutTransition.play();
            firstLabel.setText("");
        }else{
            firstLabel.setText("当前是第一张图片");
        }

    }

    //下一张
    void NextImage(){
        firstLabel.setText("");
        if(imageFilesIndex+1<imageFiles.size()){
            imageFilesIndex++;
            // 创建并设置淡出效果
            FadeTransition fadeOutTransition = new FadeTransition(Duration.millis(1000), imageView);
            fadeOutTransition.setFromValue(1.0); // 完全不透明
            fadeOutTransition.setToValue(0.0);   // 完全透明
            fadeOutTransition.setOnFinished(event -> {
                // 切换到下一张图片
                SetImageView(imageFilesIndex);
                // 创建并设置淡入效果
                FadeTransition fadeInTransition = new FadeTransition(Duration.millis(1000), imageView);
                fadeInTransition.setFromValue(0.0); // 完全透明
                fadeInTransition.setToValue(1.0);   // 完全不透明
                fadeInTransition.play();
            });
            // 开始播放淡出效果
            fadeOutTransition.play();
            lastLabel.setText("");
        }else{
            lastLabel.setText("当前是最后一张图片");
        }
    }

    //自动播放部分
    void StartAutoPlay(){
        timer = new Timer();      //时种只能打开一次，不然会错误
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                // 确保我们没有超过图像数组的索引
                if (imageFilesIndex + 1 < imageFiles.size()) {
                    NextImage(); // 播放下一张图片
                } else {
                    // 如果已经是最后一张图片，停止自动播放并显示提示信息
                    StopAutoPlay();
                    // 使用JavaFX线程来更新UI元素
                    Platform.runLater(() -> {
                        lastLabel.setText("当前是最后一张图片");
                    });
                }
            }
        }, 0, 3000);
    }

    //停止播放
    void StopAutoPlay() {
        timer.cancel();
    }

    // 删除图片的方法
    public  void removeImageFromView() {
        if(imageFiles.size()==0){

        }else {
            File file = imageFiles.get(imageFilesIndex);
            imageFiles.remove(imageFilesIndex);
            imageHBox.getChildren().remove(imageFilesIndex);
            if (imageFiles.size() != 0) {
                imageFilesIndex = (imageFilesIndex--) % imageFiles.size();
                SetImageView(imageFilesIndex);
            } else {
                //Stage stage = (Stage) firstLabel.getScene().getWindow(); // 获取按钮所在的窗口
                //stage.close(); // 关闭窗口
            }
            // 尝试删除文件
            if (file.delete()) {
                System.out.println("文件已成功删除.");
            } else {
                System.out.println("无法删除文件.");
            }
        }

    }

    //返回当前播放的图片
    int getImageFilesIndex(){
        return imageFilesIndex;
    }
}
